<?php
namespace App;

class Router
{
    // 路由表
    private $routes = [];

    // 添加路由（方法，路由请求的路径，controller中的执行的函数）
    public function add($method, $path, $handler){
        $this->routes[] = [
            'method' => $method,
            'path' => $path,
            'handler' => $handler,
        ];
    }

    // 执行路由的匹配和分发
    public function run() {
        // 获取详细的请求URL，解析url提取路径的部分
        $uri = $_SERVER['REQUEST_URI'];
        
        // 移除查询字符串
        $uri = parse_url($uri, PHP_URL_PATH);
        
        // 获取http的请求方式
        $method = $_SERVER['REQUEST_METHOD'];
        
        // 进行遍历路由列表找到对应的路由
        foreach ($this->routes as $route) {
            // 匹配路由
            if ($route['method'] === $method && $this->matchPath($uri, $route['path'])){
                // 匹配成功，执行路由controller中的函数
                call_user_func_array($route['handler'], [$uri]);
                return;
            }
        }

        http_response_code(404);
        header('Content-Type: application/json');
        echo json_encode(['error' => 'Route not found']);
    }

    // 镜像匹配路由的路径
    /**
     * @param $uri 请求的路径
     * @param $pattern 路由的匹配路径
     * @return bool
     */
    private function matchPath($uri, $pattern) {
        // 先处理参数占位符 {id}
        $pattern = preg_replace('/\{([^}]+)\}/', '([^\/]+)', $pattern);
        
        // 添加路径前缀和结尾的斜杠处理
        $pattern = trim($pattern, '/');
        $uri = trim($uri, '/');
        
        // 使用正则表达式进行匹配
        $regex = '#^' . $pattern . '$#';
        $result = preg_match($regex, $uri);
        
        // 添加调试信息
        error_log("Matching pattern: " . $pattern);
        error_log("Matching uri: " . $uri);
        error_log("Regex: " . $regex);
        error_log("Result: " . $result);
        
        return $result;
    }
}